package com.example.stuwork.dao;

import com.example.stuwork.pojo.Submission;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 作业提交DAO接口
 */
@Mapper
public interface SubmissionDao {
    
    /**
     * 获取所有作业提交
     * 
     * @return 作业提交列表
     */
    List<Submission> findAll();
    
    /**
     * 根据ID获取作业提交
     * 
     * @param submissionId 提交ID
     * @return 作业提交对象
     */
    Submission getById(Long submissionId);
    
    /**
     * 根据作业ID获取提交列表
     * 
     * @param assignmentId 作业ID
     * @return 提交列表
     */
    List<Submission> findByAssignmentId(Long assignmentId);
    
    /**
     * 根据学生ID获取提交列表
     * 
     * @param studentId 学生ID
     * @return 提交列表
     */
    List<Submission> findByStudentId(String studentId);
    
    /**
     * 根据作业ID和学生ID获取提交
     * 
     * @param assignmentId 作业ID
     * @param studentId 学生ID
     * @return 提交对象
     */
    Submission findByAssignmentIdAndStudentId(
        @Param("assignmentId") Long assignmentId, 
        @Param("studentId") String studentId
    );
    
    /**
     * 根据状态获取提交列表
     * 
     * @param status 状态
     * @return 提交列表
     */
    List<Submission> findByStatus(Integer status);
    
    /**
     * 获取未批改的提交列表
     * 
     * @return 提交列表
     */
    List<Submission> findUngradedSubmissions();
    
    /**
     * 根据作业ID和状态获取提交列表
     * 
     * @param assignmentId 作业ID
     * @param status 状态
     * @return 提交列表
     */
    List<Submission> findByAssignmentIdAndStatus(
        @Param("assignmentId") Long assignmentId, 
        @Param("status") Integer status
    );
    
    /**
     * 根据教师ID获取需要批改的提交列表
     * 
     * @param teacherId 教师ID
     * @return 提交列表
     */
    List<Submission> findSubmissionsForGradingByTeacherId(String teacherId);
    
    /**
     * 添加提交
     * 
     * @param submission 提交对象
     * @return 影响的行数
     */
    int insert(Submission submission);
    
    /**
     * 更新提交
     * 
     * @param submission 提交对象
     * @return 影响的行数
     */
    int update(Submission submission);
    
    /**
     * 更新提交状态
     * 
     * @param submissionId 提交ID
     * @param status 状态
     * @return 影响的行数
     */
    int updateStatus(@Param("submissionId") Long submissionId, @Param("status") Integer status);
    
    /**
     * 更新评分和反馈
     * 
     * @param submissionId 提交ID
     * @param score 分数
     * @param feedback 反馈
     * @param teacherId 教师ID
     * @param status 状态
     * @return 影响的行数
     */
    int updateGrading(
        @Param("submissionId") Long submissionId, 
        @Param("score") Integer score, 
        @Param("feedback") String feedback,
        @Param("teacherId") String teacherId,
        @Param("status") Integer status
    );
    
    /**
     * 删除提交
     * 
     * @param submissionId 提交ID
     * @return 影响的行数
     */
    int delete(Long submissionId);
    
    /**
     * 根据作业ID删除所有相关提交
     * 
     * @param assignmentId 作业ID
     * @return 影响的行数
     */
    int deleteByAssignmentId(Long assignmentId);
    
    /**
     * 根据学生ID和作业ID检查提交是否存在
     * 
     * @param studentId 学生ID
     * @param assignmentId 作业ID
     * @return 是否存在
     */
    boolean exists(@Param("studentId") String studentId, @Param("assignmentId") Long assignmentId);
    
    /**
     * 获取最新版本的提交
     * 
     * @param assignmentId 作业ID
     * @param studentId 学生ID
     * @return 提交对象
     */
    Submission findLatestVersion(
        @Param("assignmentId") Long assignmentId, 
        @Param("studentId") String studentId
    );
} 